/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package erp.financeiro.dao;

import erp.financeiro.EstadoOrcamento;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import erp.financeiro.Orcamento;
import java.util.Date;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author luiz.vieira
 */
public class OrcamentoDAO {


    public static void cadastrar(String idDadosBancarios, Date dataDeCompra, String descricao, String motivo, Long formaDePagamento, EstadoOrcamento estado, Double valorTotal, String idCompra) throws Exception {

        Orcamento dados = new Orcamento();
        
        dados.setDataDeCompra(dataDeCompra);
        dados.setDadosBancarios(DadosBancariosDAO.getDadosBancariosById(Long.parseLong(idDadosBancarios)));
        dados.setDescricao(descricao);
        dados.setMotivo(motivo);
        dados.setFormaDePagamento(formaDePagamento);
        dados.setEstado(estado);
        dados.setValorTotal(valorTotal);
        dados.setUltimoLancamento(null);
        dados.setCompra(CompraDAO.getCompraById(Long.parseLong(idCompra)));

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();
        
        em.getTransaction().begin();
        em.persist(dados);
        em.getTransaction().commit();
    }

    public static void alterar(String idDadosBancarios, Long id, Date dataDeCompra, String descricao, String motivo, Long formaDePagamento, EstadoOrcamento estado, Double valorTotal, String idCompra, Date ultimoLancamento) throws Exception {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Orcamento dados = OrcamentoDAO.getOrcamentoById(id);

        dados.setDataDeCompra(dataDeCompra);
        dados.setDadosBancarios(DadosBancariosDAO.getDadosBancariosById(Long.parseLong(idDadosBancarios)));
        dados.setDescricao(descricao);
        dados.setMotivo(motivo);
        dados.setFormaDePagamento(formaDePagamento);
        dados.setEstado(estado);
        dados.setValorTotal(valorTotal);
        dados.setUltimoLancamento(ultimoLancamento);
        dados.setCompra(CompraDAO.getCompraById(Long.parseLong(idCompra)));

        em.getTransaction().begin();
        em.merge(dados);
        em.getTransaction().commit();
    }

    public static List<Orcamento> getOrcamentos(EstadoOrcamento estado, Date dataDeCompra, Double valorInicial, Double valorFinal) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        String sqlStr = "SELECT x FROM " + Orcamento.class.getSimpleName();
        Boolean teveWhere = false;

        if (!estado.equals(null)){
            if (!teveWhere){
               sqlStr = sqlStr + " x where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.estado=:estado";
        }

        if (!dataDeCompra.equals(null)){
            if (!teveWhere){
               sqlStr = sqlStr + " x where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.dataDeCompra=:dataDeCompra";
        }

        if (!valorInicial.equals(null)){
            if (!teveWhere){
               sqlStr = sqlStr + " x where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.valorPorVencimento>=valorInicial";
        }

        if (!valorFinal.equals(null)){
            if (!teveWhere){
               sqlStr = sqlStr + " x where ";
               teveWhere = true;
            }
            else{
               sqlStr = sqlStr + " and ";
            }
            sqlStr = sqlStr + "x.valorPorVencimento<=valorFinal";
        }

        Query query = em.createQuery(sqlStr);

        if (!estado.equals(null)){
            query.setParameter("estado", estado);
        }
        if (!dataDeCompra.equals(null)){
            query.setParameter("dataDeCompra", dataDeCompra);
        }
        if (!valorInicial.equals(null)){
            query.setParameter("valorInicial", valorInicial);
        }
        if (!valorFinal.equals(null)){
            query.setParameter("valorFinal", valorFinal);
        }

        List<Orcamento> list = (List<Orcamento>) query.getResultList();

        return list;
    }

    public static Orcamento getOrcamentoById(Long id) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        return (Orcamento) em.find(Orcamento.class, id);
    }

    public static Boolean excluir(Long id){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("erpfinanceiroPU");
        EntityManager em = emf.createEntityManager();

        Orcamento dados = (Orcamento) em.find(Orcamento.class, id);

        try{
            em.getTransaction().begin();
            em.remove(dados);
            em.getTransaction().commit();
        }catch(Exception e){
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }
}
